package es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.plain;

import javax.sql.DataSource;

import es.udc.fbellas.j2ee.tiendaweb.model.direccionpostal.TO.DireccionPostalTO;
import es.udc.fbellas.j2ee.tiendaweb.model.tarjetabancaria.TO.TarjetaBancariaTO;
import es.udc.fbellas.j2ee.tiendaweb.model.usuario.TO.UsuarioProfileTO;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.TO.LoginResultTO;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.delegate.UsuarioFacadeDelegate;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.exceptions.IncorrectPasswordException;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.plain.actions.BuscarDireccionUsuarioAction;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.plain.actions.BuscarTarjetaUsuarioAction;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.plain.actions.BuscarUsuarioProfileAction;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.plain.actions.CambiarPasswordAction;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.plain.actions.LoginAction;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.plain.actions.ModificarDireccionPostalAction;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.plain.actions.ModificarTarjetaBancariaAction;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.plain.actions.ModificarUsuarioProfileAction;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.plain.actions.RegistrarUsuarioAction;
import es.udc.fbellas.j2ee.tiendaweb.model.util.GlobalNames;
import es.udc.fbellas.j2ee.util.exceptions.DuplicateInstanceException;
import es.udc.fbellas.j2ee.util.exceptions.InstanceNotFoundException;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;
import es.udc.fbellas.j2ee.util.sql.DataSourceLocator;
import es.udc.fbellas.j2ee.util.sql.PlainActionProcessor;

public class PlainUsuarioFacadeDelegate implements UsuarioFacadeDelegate {

    private String loginName;
    
    public PlainUsuarioFacadeDelegate() {
        loginName = null;
    }
    
    public void registrarUsuario(UsuarioProfileTO usuarioProfileTO, DireccionPostalTO direccionPostalTO, TarjetaBancariaTO tarjetaBancariaTO)
        throws DuplicateInstanceException, InternalErrorException {
        
        try {
        
            RegistrarUsuarioAction action = new RegistrarUsuarioAction(usuarioProfileTO, direccionPostalTO, tarjetaBancariaTO);
                
            PlainActionProcessor.process(getDataSource(), action);
            
        } catch (DuplicateInstanceException e) {
            throw e;
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
        
    }

    
    /************ AUTENTICACIÓN *************/
    
    public LoginResultTO login(String loginName, String password,
        boolean passwordIsEncrypted)
        throws InstanceNotFoundException, IncorrectPasswordException,
            InternalErrorException {

        try {
        
            LoginAction action = new LoginAction(loginName, 
                password, passwordIsEncrypted);
                
            LoginResultTO loginResultTO = 
                (LoginResultTO) PlainActionProcessor.process(getDataSource(),
                    action);
            this.loginName = loginName;
            
            return loginResultTO;
            
        } catch (IncorrectPasswordException e) {
            throw e;
        } catch (InstanceNotFoundException e) {
            throw e;
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
            
    }
        
    public UsuarioProfileTO buscarUsuarioProfile() throws InternalErrorException {
    
        try {
        
            BuscarUsuarioProfileAction action = new BuscarUsuarioProfileAction(loginName);
                
            return (UsuarioProfileTO) PlainActionProcessor.process(getDataSource(),
                action);
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
    
    }

    public TarjetaBancariaTO buscarTarjetaUsuario() throws InternalErrorException {
    
        try {
        
            BuscarTarjetaUsuarioAction action = new BuscarTarjetaUsuarioAction(loginName);
                
            return (TarjetaBancariaTO) PlainActionProcessor.process(getDataSource(),
                action);
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
    
    }

    public DireccionPostalTO buscarDireccionUsuario() throws InternalErrorException {
    
        try {
        
            BuscarDireccionUsuarioAction action = new BuscarDireccionUsuarioAction(loginName);
                
            return (DireccionPostalTO) PlainActionProcessor.process(getDataSource(),
                action);
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
    
    }


    
    public void modificarUsuarioProfile(String nombre, String apellidos, String email, String language, String country)
        throws InternalErrorException {

        try {
        
            ModificarUsuarioProfileAction action = 
                new ModificarUsuarioProfileAction(loginName, 
				nombre, apellidos, email, language, country);
                
            PlainActionProcessor.process(getDataSource(), action);
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
        
    }
    
    public void modificarTarjeta(UsuarioProfileTO usuarioProfileTO, TarjetaBancariaTO tarjetaBancariaTO)
		throws InternalErrorException{
    	try {
            
            ModificarTarjetaBancariaAction action = 
                new ModificarTarjetaBancariaAction(usuarioProfileTO, tarjetaBancariaTO);
                
            PlainActionProcessor.process(getDataSource(), action);
            
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
    }
    
    public void modificarDireccion(UsuarioProfileTO usuarioProfileTO, DireccionPostalTO direccionPostalTO)
	throws InternalErrorException{
	try {
        
        ModificarDireccionPostalAction action = 
            new ModificarDireccionPostalAction(usuarioProfileTO, direccionPostalTO);
            
        PlainActionProcessor.process(getDataSource(), action);
        
    } catch (InstanceNotFoundException e) {
        throw new InternalErrorException(e);
    } catch (InternalErrorException e) {
        throw e;
    } catch (Exception e) {
        throw new InternalErrorException(e);
    }
}
        
    public void cambiarPassword(String oldClearPassword,
        String newClearPassword) throws IncorrectPasswordException,
        InternalErrorException {

        try {
        
            CambiarPasswordAction action = new CambiarPasswordAction(loginName, 
                oldClearPassword, newClearPassword);
                
            PlainActionProcessor.process(getDataSource(), action);
            
        } catch (IncorrectPasswordException e) {
            throw e;
        } catch (InstanceNotFoundException e) {
            throw new InternalErrorException(e);
        } catch (InternalErrorException e) {
            throw e;
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
        
    }
    
    private DataSource getDataSource() throws InternalErrorException {
        return DataSourceLocator.getDataSource(
            GlobalNames.TIENDAWEB_DATA_SOURCE);
    }
    
    /* 
     * This class is tested by
     * "es.udc.fbellas.j2ee.miniportal.model.userfacade.delegate.
     * UserFacadeDelegateFactory".
     */    
    
}
